package com.guaoran.interview.before.jd;

/**
 * @author : guCheng
 * @title : 多线程 
 * @Description : 
 * 	 
 * @date :2018年3月21日上午10:33:20
 */
public class 多线程 {
	/**
	 * 多线程:
	 	1.synchronized和volatile的区别:
	 		synchronized:同步互斥，会造成阻塞，可见性和原子性。
	 		volatile：具有可见性，原子性差点（I++），当volatile写时，会将本地缓存数据写入到主内存中，并将该引用设置为无效，保证可见性。
	 		synchronized可以用在方法、变量上，而volatile只能用在变量上。
	 		volatile是轻量级的，性能比synchronized要好，因为他不会引起上下文的切换与调度。
	 		volatile用在变量上，而synchronized用在对象，方法、代码块上
	 		volatile具有可见性，不具有原子性，而synchronized具有可见性和原子性
	 		volatile不会阻塞线程，而synchronized会阻塞线程
	 		volatile解决的是变量在多线程之间的可见性，而synchronized是解决多个线程之间访问资源的同步性。
	 	2.wait和sleep
	 		sleep：不释放锁，等待一定的时间后会继续运行，
	 		wait：释放锁，需要等待发送notify或notifyAll时采用继续争夺锁。
	 			wait：执行后便会立即释放锁，而notify必须是执行完才会通知。
	 	3.线程停止，
	 		一般采用interrupte中断线程跟return或者抛异常进行中断
	 		也可以采用标志位进行判断退出，跟volatile进行搭配。
	 		stop：会强制退出线程，会导致线程未执行完，或异常释放所有锁。
	 	4.join方法：释放锁
	 		是使该线程无线阻塞到上个线程执行完后在开始执行。
	 	4.threadLocal：
	 		主要解决线程之间的私有数据，具有隔离性。
	 	5.Lock：
	 		1.ReentrantLock：具有多路分支和嗅探的功能，
	 		2.ReentrantReadWriterLock：读写锁，适用于读多，写少的操作。
	 			读读不互斥、读写和写写互斥
	 			写锁降级：先把持住写锁，在获得读锁，在释放写锁。
	 		2.condition：是一个对象监视器。实现等待、通知。使用前必须先拿到锁。
	 			await（）/signal（）
	 	6.单例模式：
	 		1.饿汉
	 		public class Ehan{
	 			private static Ehan ehan = new Ehan();
	 			priate Ehan(){}
	 			public static Ehan getObject(){
	 				return ehan;
	 			}
	 		}
	 		2.懒汉
	 		public class Lanhan{
	 			private static volatile Lanhan lanhan;
	 			private Lanhan(){}
	 			public static Lanhan getObject(){
	 				if(lanhan==null){
	 					synchronized(Lanhan.class){
	 						if(lanhan==null){
	 							lanhan = new Lanhan();
	 						}
	 					}
	 				}
	 				return lanhan;
	 			}
	 		}
	 		3.使用静态内置类：
	 		public class Signol(){
	 			private Signol(){}
	 			private class Handler{
	 				private static getObj(){
	 					private static Signol signol = new Signol();
	 				}
	 			}
	 			public static Signol getObject(){
	 				Handler.signol();
	 			} 
	 			
	 		}
	 		
	 		
	 	7.锁的状态：无锁、偏向锁、轻量级锁、重量级锁。锁只能升级不能降
	 		默认是偏向锁，将锁的信息存放在Mark word中
	 		轻量级锁：是执行同步代码块之前有jvm创建储存锁的信息，通过比较交换：CAS将锁的信息从Mark word中移动过去，通过自旋获得锁：
	 		重量级锁：要么执行，要么阻塞
	 	8.处理器实现原子性：
	 		1.总线锁：独占共享内存
	 		2.缓存锁：
	 		
	 	9.JMM：java内存模型：	
	 		1.重排序：编译器优化的重排序，指令级并行的重排序、内存系统重排序。
	 		2.顺序一致性：通过happens before 和as if serial
	 			1.happens before 在正确同步的程序中，在不改变结果的前提下，可以进行重排序。
	 			2.as if serial  在单线程的程序中，在不改变结果的前提下可以进行重排序。
	 		3.volatile的内存语义：
	 			1.第一个操作是volatile读，第二操作无论是什么都不能重排序
	 			2.第二个是volatile写，第一个无论是什么都不能重排序。
	 			3.第一个是volatile写，第二个操作是volatile写、读都不能重排序
	 		4.jvm禁止将final域的写放到构造函数外进行执行。必须在构造函数内
	 	
	 		5.概述：顺序一执行模型是一个参考模型，JMM和处理器模型在设计时以顺序一致性作为参考；设计的越弱，性能越高
	 			如果完全按照顺序一致性模型设计的话，处理器和编译器优化都要被禁止
	 		6.单线程情况下，通过编译器和处理器会共同确保单线程程序的执行结果与改程序的结果在顺序一致性模型中的结果一致；
	 			在多线程同步的情况下，编译器和处理器会通过优化禁止重排序来保证可见性。
	 			
	 		7.管道输入输出：piedoutputstream、piedinputstream；piedRead；piedWriter
	 		
	 	10、线程池：降低资源消耗、提高响应速度；提高线程的可管理性
	 		创建一个任务，判断线程是否都在执行任务，如果不是，创建一个线程进行处理，
	 		否则，查看线程工作队列一否已满，如果未满，放到线程工作队列中，
	 		如果已满，查看线程是否有空闲线程，如果有，创建一个线程进行执行任务，否则交给饱和策略去处理
	 		
	 		
	 */
}
